package muni.ilo.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import muni.ilo.dto.DistritoDTO;
import muni.ilo.dto.TipoUsuarioDTO;
import muni.ilo.dto.UsuarioDTO;
import muni.ilo.dto.UsuarioLoginDTO;
import muni.ilo.util.MySqlDataSource;



public class UsuarioMySqlDAO implements Usuario_IF {

	public List<UsuarioDTO> listaPorNombre(String strNombre)
										throws Exception{
		
		List<UsuarioDTO> lstUsuarios=new ArrayList<UsuarioDTO>();
		
		Connection cn= MySqlDataSource.getConnection();
	
		String sql = "select * from usuario where nombreUsuario like ? order by codTipoUsuario";
		PreparedStatement pst= cn.prepareStatement(sql);
		pst.setString(1,"%"+strNombre+"%");
		
		ResultSet rs=pst.executeQuery();
		
		while(rs.next()){
			UsuarioDTO objUsua= new UsuarioDTO();
			objUsua.setCodigo(rs.getString(1));
			objUsua.setNombre(rs.getString(2));
			objUsua.setApePat(rs.getString(3));
			objUsua.setApeMat(rs.getString(4));
			objUsua.setSexo(rs.getString(5));
			objUsua.setTelefono(rs.getString(6));
			objUsua.setEmail(rs.getString(7));
			objUsua.setFecReg(rs.getDate(8));
			objUsua.setFecAct(rs.getDate(9));
			objUsua.setEstado(rs.getString(10));
			objUsua.setDistrito(rs.getString(13));
			objUsua.setCodTipo(rs.getString(14));
			
			lstUsuarios.add(objUsua);
		}
		
		cn.close();
		
		return lstUsuarios;
	}
	
	public List<DistritoDTO> listaDistritos()
									throws Exception{

		List<DistritoDTO> lstDistritos = new ArrayList<DistritoDTO>();
	
		Connection cn = MySqlDataSource.getConnection();
		
		String sql = "select * from distrito";
		PreparedStatement pst= cn.prepareStatement(sql);

		ResultSet rs = pst.executeQuery();
		
		while(rs.next()){
			
			DistritoDTO objDis= new DistritoDTO();
			objDis.setCodigo(rs.getString(1));
			objDis.setDescripcion(rs.getString(2));

			lstDistritos.add(objDis);
		}

		cn.close();
		
		return lstDistritos;
	}
	
	private String generarCodigo(String codTipo) throws Exception{
		
		String strCodigo=null;
		StringBuffer sbCodigo = new StringBuffer();
		Connection cn = MySqlDataSource.getConnection();
		int intCount = 0;
		String sql = "select  right(right(MAX(codUsuario),2)+101,2) as codigo from usuario where codTipoUsuario = ?";	
		PreparedStatement pst=cn.prepareCall(sql);	
		pst.setString(1, codTipo);
		ResultSet rs=pst.executeQuery();
		if(codTipo.equals("TIP01")){
			sbCodigo.append("SETR");
		}else if(codTipo.equals("TIP02")){
			sbCodigo.append("JEOU");
		}else if(codTipo.equals("TIP03")){
			sbCodigo.append("TECN");
		}else if(codTipo.equals("TIP04")){
			sbCodigo.append("SEOU");
		}else if(codTipo.equals("TIP05")){
			sbCodigo.append("CAJE");
		}
		
		while(rs.next()){
			sbCodigo.append(rs.getString(1));
			intCount++;
		}	
		cn.close();
		
		strCodigo = sbCodigo.toString();
		if(intCount == 0 )
			strCodigo = null;
		
		return strCodigo;
	}
	
	public String registrarUsuario(UsuarioDTO usua)throws Exception {
		
		String strCodigoGen = generarCodigo(usua.getCodTipo());
		if(strCodigoGen == null){
			return "Error al generar el codigo";
		}
		Connection cn = MySqlDataSource.getConnection();
		
		String sql = "INSERT INTO usuario VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
		PreparedStatement pst= cn.prepareStatement(sql);
		pst.setString(1, strCodigoGen);
		pst.setString(2, usua.getNombre());
		pst.setString(3, usua.getApePat());
		pst.setString(4, usua.getApeMat());
		pst.setString(5, usua.getSexo());
		pst.setString(6, usua.getTelefono());
		pst.setString(7, usua.getEmail());
		pst.setDate(8,  new Date(usua.getFecReg().getTime()));
		pst.setDate(9,  new Date(usua.getFecReg().getTime()));
		pst.setString(10, usua.getEstado());
		pst.setString(11, usua.getLogin());
		pst.setString(12, usua.getPassword());
		pst.setString(13, usua.getDistrito());
		pst.setString(14, usua.getCodTipo());
		
		String strResp = "Se inserto correctamente";
		int intResu = pst.executeUpdate();
		
		if(intResu==0)
			strResp = null;
		
		cn.close();
		
		return strResp;
	}

	public UsuarioDTO buscarUsuarioPorCodigo(String strCod)throws Exception {
		
		UsuarioDTO objUsua=null;
		
		Connection cn = MySqlDataSource.getConnection();
		
		String sql = "select * from usuario where codUsuario = ?";
		PreparedStatement pst=cn.prepareCall(sql);
		pst.setString(1, strCod);
		ResultSet rs=pst.executeQuery();
			
		while(rs.next()){
				
			objUsua = new UsuarioDTO();
			objUsua.setCodigo(rs.getString(1));
			objUsua.setNombre(rs.getString(2));
			objUsua.setApePat(rs.getString(3));
			objUsua.setApeMat(rs.getString(4));
			objUsua.setSexo(rs.getString(5));
			objUsua.setTelefono(rs.getString(6));
			objUsua.setEmail(rs.getString(7));
			objUsua.setFecReg(rs.getDate(8));
			objUsua.setFecAct(rs.getDate(9));
			objUsua.setEstado(rs.getString(10));
			objUsua.setDistrito(rs.getString(13));
			objUsua.setCodTipo(rs.getString(14));
		}	
		cn.close();

		return objUsua;
	}

	public String desactivarUsuario(String strCod)throws Exception {
		
		Connection cn = MySqlDataSource.getConnection();
		
		String sql = "update usuario set estadoUsuario=? where codUsuario=?";
		PreparedStatement pst= cn.prepareStatement(sql);
		pst.setString(1, "DESACTIVADO");
		pst.setString(2, strCod);
		
		int intResu = pst.executeUpdate();
		String strResp = null; 
		
		if(intResu>0)
			strResp = "se desactivo correctamente";
		else
			strResp = null;
		
		cn.close();
		
		return strResp;
	}
	
	public String activarUsuario(String strCod)throws Exception {
		
		Connection cn = MySqlDataSource.getConnection();
		
		String sql = "update usuario set estadoUsuario=? where codUsuario=?";
		PreparedStatement pst= cn.prepareStatement(sql);
		pst.setString(1, "ACTIVADO");
		pst.setString(2, strCod);
		
		int intResu = pst.executeUpdate();
		String strResp = null;
		
		if(intResu>0)
			strResp = "Se activo correctamente";
		else
			strResp = null;
		
		cn.close();
		
		return strResp;
	}

	public String modificar(UsuarioDTO usua)throws Exception {
		
		Connection cn = MySqlDataSource.getConnection();
		
		String sql = "UPDATE usuario set nombreUsuario=?,apepaterUsuario=?," +
					"apematerUsuario=?,sexoUsuario=?,telefonoUsuario=?,emailUsuario=?," +
					"fRegUsuario=?,fActUsuario=?,codDistri=? where codUsuario=?";
		PreparedStatement pst= cn.prepareStatement(sql);
		pst.setString(1, usua.getNombre());
		pst.setString(2, usua.getApePat());
		pst.setString(3, usua.getApeMat());
		pst.setString(4, usua.getSexo());
		pst.setString(5, usua.getTelefono());
		pst.setString(6, usua.getEmail());
		pst.setDate(7,  new Date(usua.getFecReg().getTime()));
		pst.setDate(8, new Date(usua.getFecAct().getTime()));
		pst.setString(9, usua.getDistrito());
		pst.setString(10, usua.getCodigo());

		int intResu = pst.executeUpdate();
		String strResp = null;
		
		if(intResu>0){
			strResp = "Se modifico correctamente";
		}
		else{
			strResp = null;
		}
		
		cn.close();
		
		return strResp;
	}

	public List<TipoUsuarioDTO> listaTipos() throws Exception {
		
		List<TipoUsuarioDTO> lstTipos = new ArrayList<TipoUsuarioDTO>();
		
		Connection cn= MySqlDataSource.getConnection();
		
		String sql = "select * from tipousuario";
		PreparedStatement pst= cn.prepareStatement(sql);
		ResultSet rs = pst.executeQuery();
		
		while(rs.next()){
			
			TipoUsuarioDTO objTip = new TipoUsuarioDTO();
			objTip.setCodTipo(rs.getString(1));
			objTip.setDescTipo(rs.getString(2));

			lstTipos.add(objTip);
		}

		cn.close();
		
		return lstTipos;
	}

	public UsuarioLoginDTO usuarioLogin(String strLog, String strPass) throws Exception {
		
		UsuarioLoginDTO objUsua=null;
		int intContador = 0;
		
		Connection cn = MySqlDataSource.getConnection();

		String sql = "select u.codUsuario,u.nombreUsuario,u.apepaterUsuario," +
					"u.estadoUsuario,t.codTipoUsuario,t.descripcion from usuario " +
					"as u inner join tipousuario as t on u.codTipoUsuario = " +
					"t.codTipoUsuario where u.loginUsuario = ? and u.passwordUsuario = ?";
		PreparedStatement pst=cn.prepareCall(sql);
		pst.setString(1, strLog);
		pst.setString(2, strPass);
			
		ResultSet rs=pst.executeQuery();
			
		while(rs.next()){
				
			objUsua = new UsuarioLoginDTO();
			objUsua.setCodUsua(rs.getString(1));
			objUsua.setNomUsua(rs.getString(2)+" "+rs.getString(3));
			objUsua.setEstadoUsua(rs.getString(4));
			objUsua.setCodTipo(rs.getString(5));
			objUsua.setDescTipo(rs.getString(6));
			intContador++;
		}	
		cn.close();
			
		if(intContador>0){
			return objUsua;
		}else{
			return null;
		}
	}
	

	
}
